// 异常处理
// C++ 异常处理主要通过三个关键字来实现：try、catch、throw。
//
#include <iostream>
#include <exception> //C++ 标准库异常类定义在<exception>。
using namespace std;
// 通过继承和重载 exception 类自定义异常类。
struct MyException : public exception
{
    char *what() throw() // ruturn类型是const char*，throw()是异常规范，表示这个函数不会抛出异常。
    {
        return "C++ Exception"; // return数组
    }
};
double division(int a, int b)
{
    if (b == 0)
    {
        throw "2.0"; // throw 语句抛出一个异常。throw 语句的操作数可以是任意的表达式，表达式的结果的类型决定了抛出的异常的类型。
        // throw"1";
        // throw MyException();
    }
    return (a / b);
}

int main()
{
    int x = 50;
    int y = 0;
    double z = 0;

    try // try 块中放置可能抛出异常的代码，try 块中的代码被称为保护代码
    {
        z = division(x, y);
        cout << z << endl;
    }
    catch (const char *msg) // catch 块跟在 try 块后面，用于捕获异常。throw抛出的异常和 catch 数据类型匹配时会被执行。
    {
        cerr << msg << endl;
    }
    catch (MyException &e)
    {
        cerr << e.what() << endl; // what() 函数被exception子类重载，返回异常的原因。
    }
    catch (int x)
    {
        cerr << "catch int" << endl;
    }
    catch (float x)
    {
        cerr << "diffrent throw" << endl;
    }
    catch (...) // catch(...) 会捕获所有的异常。可以在一个 try 语句中使用多个 catch 块。
    {
        cerr << "Default exception" << endl;
    }
    return 0;
}